perm filename TYPE30.SAI[XGP,BGB] blob
sn#023232 filedate 1973-02-06 generic text, type T, neo UTF8
00100 ENTRY DOTDD,SHOWDD,CLRDD,ERASDD,STRDD,AIDD,AVDD;
00200 BEGIN "TYPE31"
00300 REQUIRE "ABBREV[SYS,BGB]" SOURCE_FILE;
00400 INTERNAL SAFE INTEGER ARRAY DDBUF[1:480*18+2];
00500 INTEGER DDPTR,DDBIT;
00600 INTERNAL INTEGER SAVING;
00700 SAFE INTEGER ARRAY FLIPS[1:500];
00800 INTEGER FLIPTR;
00900 INTERNAL PROCEDURE CLRDD (INTEGER CHAN);
01000 BEGIN "CLRDD"
01100 INTEGER LINE,LINEWD,COLCHN;
01200 α RESET GRAPHICS COMMAND WORDS TO ALL ZEROES;
01300 DDBUF[1] ← 2;
01400 ARRBLT(DDBUF[2],DDBUF[1],480*18);
01500 α RESET COLUMN,COLUMN,CHANNEL WORDS TO 1,1,0;
01600 COLCHN ← '002004003324;
01700 DPB(CHAN,POINT(8,COLCHN,23));
01800 FOR DDPTR←2 STEP 18 UNTIL 2+18*479 DO
01900 DDBUF[DDPTR] ← COLCHN;
02000 α RESET EXECUTE, LINE SELECT COMMAND WORDS;
02100 FOR LINE←0 STEP 1 UNTIL 479 DO
02200 BEGIN "ROWS"
02300 LINEWD ← '0454;
02400 DPB(LINE ,POINT(4,LINEWD,23));
02500 DPB(LINE%16,POINT(5,LINEWD,15));
02600 DDPTR ← ((LINE LAND 3)*120 + LINE%4)*18 + 1;
02700 DDBUF[DDPTR]← LINEWD;
02800 END "ROWS";
02900 α RESET THE FIRST AND THE LAST TWO COMMAND WORDS;
03000 DDPTR ← 480*18;
03100 DDBUF[1]← DDBUF[1] LOR '116000001454;
03200 DDBUF[DDPTR+1]← '000004010334;
03300 DDBUF[DDPTR+2]← 0;
03400 END "CLRDD";
00100 INTERNAL PROCEDURE DOTDD (INTEGER X,Y);
00200 BEGIN "DOTDD"
00300 INTEGER PTR;
00400 X ← (0 MAX X) MIN 511;
00500 Y ← (0 MAX Y) MIN 479;
00600 DDPTR ← ((Y LAND 3)*120 + (Y%4))*18 + (X%32) + 3;
00700 DDBIT ← X LAND '37;
00800 PTR ← POINT(1,DDBUF[DDPTR],DDBIT);
00900 IF SAVING ∧ 0=LDB(PTR) THEN FLIPS[FLIPTR←FLIPTR+1]←PTR;
01000 DPB(1,PTR);
01100 END "DOTDD";
01200
01300 INTERNAL PROCEDURE DITDD (INTEGER X,Y);
01400 BEGIN "DITDD"
01500 INTEGER PTR;
01600 X ← (0 MAX X) MIN 511;
01700 Y ← (0 MAX Y) MIN 479;
01800 DDPTR ← ((Y LAND 3)*120 + (Y%4))*18 + (X%32) + 3;
01900 DDBIT ← X LAND '37;
02000 PTR ← POINT(1,DDBUF[DDPTR],DDBIT);
02100 IF SAVING ∧ 1=LDB(PTR) THEN FLIPS[FLIPTR←FLIPTR+1]←PTR;
02200 DPB(0,PTR);
02300 END "DITDD";
02400
02500 INTERNAL PROCEDURE UNDO;
02600 BEGIN
02700 INTEGER PTR;
02800 WHILE FLIPTR≠0 DO
02900 ⊂ PTR←FLIPS[FLIPTR];
03000 IF LDB(PTR) THEN
03100 DPB(0,PTR) ELSE DPB(1,PTR);
03200 FLIPTR←FLIPTR-1;⊃;
03300 END;
03400
03500 INTERNAL PROCEDURE SHOWDD;
03600 QUICK_CODE "SHOWDD"
03700 INTEGER T1,T2;
03800 MOVEI 11,8642;
03900 MOVEM 11,T2;
04000 MOVE 11,DDBUF;
04100 HRRZM 11,T1;
04200 '715000000000 3,T1;
04300 END "SHOWDD";
00100 INTERNAL PROCEDURE LINEDD (INTEGER X1,Y1,X2,Y2);
00200 BEGIN "LINEDD"
00300 REAL DX,DY,X,Y;
00400 INTEGER I,N;
00500 DX ← X2-X1;
00600 DY ← Y2-Y1;
00700 N ← ABS(DX) MAX ABS(DY);
00800 DX ← DX/N;
00900 DY ← DY/N;
01000 DOTDD(X←X1,Y←Y1);
01100 FOR I←2 STEP 1 UNTIL N DO
01200 DOTDD(X←X+DX,Y←Y+DY);
01300 DOTDD(X2,Y2);
01400 END "LINEDD";
01500 INTEGER BEAMX,BEAMY;
01600 INTERNAL PROCEDURE AIDD (INTEGER X,Y);
01700 BEGIN "AIDD"
01800 BEAMX ← X;
01900 BEAMY ← Y;
02000 END "AIDD";
02100
02200 INTERNAL PROCEDURE AVDD (INTEGER X,Y);
02300 BEGIN "AVDD"
02400 LINEDD(BEAMX,BEAMY,X,Y);
02500 BEAMX ← X;
02600 BEAMY ← Y;
02700 END "AVDD";
00100 α ERASE THE DATA DISC'S SCREEN;
00200 INTERNAL PROCEDURE ERASDD (INTEGER CHAN);
00300 BEGIN
00400 INTEGER COLCHN,X1,X2,X3;
00500 COLCHN ← '136004301324;
00600 DPB(CHAN,POINT(8,COLCHN,23));
00700 X1←0;
00800 START_CODE "ERASDD"
00900 INTEGER T1,T2;
01000 LABEL L;
01100 MOVEI 11,COLCHN;
01200 MOVEM 11,T1;
01300 MOVEI 11,2;
01400 MOVEM 11,T2;
01500 L: '715000000000 3,T1;
01600 END "ERASDD";
01700 END;
00100 α DISPLAY A STRING ON CHANNEL 36;
00200 INTERNAL PROCEDURE STRDD (INTEGER X,Y; STRING STR);
00300 BEGIN "STRDD"
00400 INTEGER SIZ,I;
00500 SIZ ← LENGTH(STR);
00600 IF SIZ=0 THEN RETURN;
00700 SIZ ← (IF SIZ MOD 5 THEN 1 ELSE 0) + SIZ%5;
00800 BEGIN "DDBLK"
00900 INTEGER ARRAY DDBUF[-1:SIZ+2+10];
01000 INTEGER FNLINE,COLCHN;
01100 α ASSEMBLE THE FUNCTION AND LINE SELECT WORD;
01200 FNLINE ← '1454;
01300 DPB('66, POINT(6,FNLINE, 7));
01400 DPB(Y%16, POINT(5,FNLINE,15));
01500 DPB(Y, POINT(4,FNLINE,23));
01600 DDBUF[-1]← FNLINE;
01700 α ASSEMBLE THE COLUMN AND CHANNEL SELECT WORD;
01800 COLCHN ← '3324;
01900 DPB(1, POINT(8,COLCHN, 7));
02000 DPB(X DIV 6, POINT(8,COLCHN,15));
02100 DPB('35, POINT(8,COLCHN,23));
02200 DDBUF[0]← COLCHN;
02300 α PACK THE STRING INTO TEXT COMMAND WORDS;
02400 FOR I←1 STEP 1 UNTIL SIZ-1 DO
02500 BEGIN "PACK"
02600 DDBUF[I]← CVASC(STR) LOR 1;
02700 STR ← STR[6 TOO ∞];
02800 END "PACK";
02900 DDBUF[SIZ]← CVASC(STR) LOR 1;
03000 DDBUF[SIZ+1]← '000004010034;
03100 DDBUF[SIZ+2]← 0;
03200 α DISPLAY DD BUFFER;
03300 QUICK_CODE
03400 INTEGER T1,T2;
03500 MOVE 11,SIZ;
03600 ADDI 11,4;
03700 MOVEM 11,T2;
03800 MOVE 11,DDBUF;
03900 HRRZM 11,T1;
04000 '715000000000 3,T1;
04100 HRRZ 11,@DDBUF;
04200 TRC 11,'010000;
04300 HRRM 11,@DDBUF;
04400 '715000000000 3,T1;
04500 END;
04600 END "DDBLK";
04700 END "STRDD";
04800 END "TYPE31";